﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using DAO;
using Domain;
using Microsoft.Practices.EnterpriseLibrary.Validation;


public partial class EmpPublicacion : System.Web.UI.Page
{
    public long? id { 
        get { 
            long l = 0;

            if (ViewState["id"] != null)
            {
                l = (long) ViewState["id"];
            }
            else if (Request.QueryString["id"] == null ||
                    !long.TryParse(Request.QueryString["id"], out l) ||
                    l <= 0)
                return null;
            return l;
        }
        set {
            ViewState["id"] = value;
        }
    }

    public void SubidaCompletada(Imagen img)
    {
        ul_mensajes.InnerHtml = string.Empty;

        if (img == null)
        {
            ul_mensajes.InnerHtml += "<li class='itemerror'>" + "Ocurrio un inconveniente. Intente nuevamente mas tarde" + "</li>";
            return;
        }

        img_logo.Attributes["id"] = img.id.ToString();
        img_logo.ImageUrl = Utils.imageHandlerPath(img.id, false);
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        iu_ctrl.SubidaCompletada_Event += new imgUpload.SubidaCompletada(SubidaCompletada);

        if(!IsPostBack)
        {
            cargarPublicacion();
        }
    }

    private void cargarPublicacion()
    {

        if (id.HasValue)
        {

            Empresa emp = (Empresa)Utils.operadorLogueado;
            Publicacion pub = (from p in emp.Publicaciones
                               where p.Id == id.Value
                               select p).First();

            // conf
            lbl_nropublicacion.Text = pub.Id.ToString();

            txt_descripcion.Text = pub.Descripcion;

            img_logo.ImageUrl = Utils.imageHandlerPath(pub.Logo, pub is Empresa);
            img_logo.Attributes.Add("id", pub.Logo.HasValue ? pub.Logo.Value.ToString() : "");

            txt_fcaducacion.Text = pub.FechaCaducidad.HasValue ? pub.FechaCaducidad.Value.ToString("dd/MM/yyyy") : string.Empty;

            // data
            ta_contenido.Value = Server.HtmlDecode(pub.UltimaRevision.Datos);

            if (pub.FechaCaducidad.HasValue &&
               pub.FechaCaducidad <= DateTime.Now)
            {
                txt_fcaducacion.Enabled = false;
            }

            if (pub.Estado != Publicacion.enum_Publicacion_Estado.Publicada)
            {
                if (pub.Estado == Publicacion.enum_Publicacion_Estado.Anulada)
                {
                    ul_mensajes.InnerHtml += "<li class='itemerror'>" + "Esta publicación ha sido anulada por el administrador" + "</li>";
                }

                btn_guardar.Enabled = false;
                txt_descripcion.Enabled = false;
                txt_fcaducacion.Enabled = false;
                ta_contenido.Disabled = true;
            }
        }
    }

    protected void btn_guardar_Click(object sender, EventArgs e)
    {
        ul_mensajes.InnerHtml = string.Empty;

        DateTime f;
        DateTime? fc = null;
        long l;
        long? logo = null;

        if (!string.IsNullOrEmpty(txt_fcaducacion.Text))
        {
            if (!DateTime.TryParse(txt_fcaducacion.Text, out f) ||
               f < DateTime.Now)
            {
                ul_mensajes.InnerHtml += "<li class='itemerror'>" + "Debe especificar una fecha de caducación válida" + "</li>";
                return;
            }
            else
            {
                fc = f;
            }
        }

        logo = string.IsNullOrEmpty(img_logo.Attributes["id"]) ? (long?)null : long.Parse(img_logo.Attributes["id"]);


        Empresa emp = (Empresa)Utils.operadorLogueado;
        Publicacion pub = null;

        PublicacionFeed pf = new PublicacionFeed(ta_contenido.InnerHtml,
                                                 DateTime.Now);

        if (id.HasValue)
        {
            pub = (from p in emp.Publicaciones
                   where p.Id == id.Value
                   select p).First();
            pub.Descripcion = txt_descripcion.Text;
            pub.FechaCaducidad = fc;
            pub.Logo = logo;
            pub.Revisiones.Add(pf);
        }
        else
        {
            List<PublicacionFeed> lpf = new List<PublicacionFeed>();
            lpf.Add(pf);

            pub = new Publicacion(0,
                                   logo,
                                   txt_descripcion.Text,
                                   DateTime.Now,
                                   fc,
                                   null,
                                   null,
                                   lpf);
        }
        

        ValidationResults validaciones = Validation.Validate(pub);
        if (validaciones.Count() != 0)
        {
            foreach (ValidationResult v in validaciones)
            {
                ul_mensajes.InnerHtml += "<li class='itemerror'>" + v.Message + "</li>";
            }

            // walkaround: refresco el objeto xq ya modique la publicacion en coleccion de la empresa si es que existe!!!
            Utils.operadorLogueado = EmpresaDAO.Traer(emp.UserName);
            return;
        }

        string message = id.HasValue ? "Se guardó la publicación" : "Se creó la publicación";

        id = PublicacionDAO.GuardarPublicacion(emp, pub);

        if (!id.HasValue)
        {
            ul_mensajes.InnerHtml += "<li class='itemerror'>" + "Ocurrio un inconveniente al guardar la publicación" + "</li>";
            return;
        }
        
        Utils.operadorLogueado = EmpresaDAO.Traer(emp.UserName);

        ul_mensajes.InnerHtml += "<li class='itemok'>" + message + "</li>";

        cargarPublicacion();

    }

    protected void btn_cancelar_Click(object sender, EventArgs e)
    {
        Response.Redirect(Utils.SecureRedirect("~/EmpPublicaciones.aspx"));
    }
}
